dragsource: Keep the source alive long enough
authorMatthias Clasen <mclasen@redhat.com>
Mon, 3 May 2021 21:00:17 +0000 (17:00 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 3 May 2021 21:00:17 +0000 (17:00 -0400)
When a drop causes the event controller to be finalized
(directly or indirectly), we end up segfaulting while
trying to wrap up the drag operation. So, keep a reference
on the GtkDragSource from when the drag begins to when
it is done.

This fixes a crash in gnome-todo when dragging tasks.

gtk/gtkdragsource.c

index cd6c33a7fadf3b9085955509ebfd460fe76d8055..a75f60f5c22fa7ac66cb9fb0b9d8ff4a836bca3c 100644 (file)
@@ -470,6 +470,7 @@ drag_end (GtkDragSource *source,
 
   gdk_drag_drop_done (source->drag, success);
   g_clear_object (&source->drag);
+  g_object_unref (source);
 }
 
 static void
@@ -593,6 +594,9 @@ gtk_drag_source_drag_begin (GtkDragSource *source)
 
   gtk_drag_source_ensure_icon (source, source->drag);
 
+  /* Keep the source alive until the drag is done */
+  g_object_ref (source);
+
   g_signal_connect (source->drag, "dnd-finished",
                     G_CALLBACK (gtk_drag_source_dnd_finished_cb), source);
   g_signal_connect (source->drag, "cancel",